H1
My linkedin   גדעון קוך  

GK10

H 2

פורומים

 

קוד לאתרים

 

טכנולוגיות אינטרנט

 

בנה תיק עבודות

דוגמאות לשאילתות ב-SQL לעומת NoSQL



Photo by Glenn Carstens-Peters on Unsplash


מאגרי מידע יחסיים מאחסנים נתונים בצורה טבלאית עם שורות ועמודות שכותרתו. למרות שמאגרי מידע יחסיים בדרך כלל מספקים פיתרון הגון לאחסון נתונים, מהירות ומדרגיות עשויים להיות בעיה במקרים מסוימים. SQL (Structured Query Language) משמש לרוב מערכות ניהול מסדי הנתונים היחסיות לניהול מסדי נתונים המאחסנים נתונים בצורה טבלאית.

NoSQL מתייחס לתכנון מסדי נתונים שאינו SQL או שאינו יחסי. זה עדיין מספק דרך מסודרת לאחסון נתונים אך לא בצורה טבלאית. שים בצד את הדאגה למהירות ולהרחבה, מאגרי SQL ו- NoSQL מספקים דרכים תכליתיות ויעילות לשאילתת נתונים. זה חובה עבור מסד נתונים מכיוון שלנגישות יש חשיבות מכרעת גם כן.

במאמר זה אסקור 8 דוגמאות המדגימות כיצד לבצע שאילתות על מסד נתונים של SQL ו- NoSQL. הדוגמאות יכסו כיצד:

 • שאילתא עם סינון

 • הכנס פריטים חדשים

• עדכן פריטים קיימים

• יישום פונקציות צבירה

אשלים את אותן המשימות בשני מסדי הנתונים כדי שנוכל לראות את ההבדלים והדמיון. אני אשתמש ב- MySQL עבור SQL ו- MongoDB עבור NoSQL.

לפני שמתחילים בדוגמאות, אסביר בקצרה כיצד מאוחסנים נתונים ב- SQL וב- NoSQL.

SQL מאחסן נתונים בצורה טבלאית עם שורות ועמודות.

המבנים הנפוצים המותאמים על ידי מסדי נתונים NoSQL לאחסון נתונים הם צמדי ערך מפתח, עמודות המאוגדות במסמך. MongoDB שומר נתונים כמסמכים. מסמך ב- MongoDB מורכב מזוגות ערך שדה.

המסמכים מאורגנים במבנה הנקרא "אוסף". כאנלוגיה, אנו יכולים לחשוב על מסמכים כשורות בטבלה ואוספים כטבלאות. יצרתי טבלה פשוטה ב- MySQL ואוסיף ב- MongoDB עם אותם נתונים המכילים תכונות של מכוניות מסוימות ומחיריהן.


8 שאילתות ב-SQL  וב NoSQL




Photo by Joshua Earle on Unsplash


הסבר SQL NoSQL


להלן מבנה הנתונים שעליו איישם את השאילתות כדי להדגים את השוני בין שפת השאילתות השונות. לצורך השאילתות ב-SQL בחרתי ב-MySQL ולצורך פעילות על מסד נתונים NoSQL בחרתי ב-MongoDB.



year make color km price
2017 ford black 34000 28000
2017 hyundai black 34000 28000


{ "_id" : ObjectId("600c63cf32e0e6419cee81ab"),
"year" : "2017",
"make" : "ford",
"color" : "black",
"km" : 34000,
"price" : 28000
}





מצא את המכוניות מתוצרת פורד.
מאחר ויש יותר ממכונית אחת כזו השתמשתי ב-limit


mysql > select * from car where make = "ford" limit 1
Will result:

year make color km price
2017 ford black 34000 28000


> db.car.find( {make: "ford"} ).limit(1).pretty()
Will result:

{ "_id" : ObjectId("600c63cf32e0e6419cee81af"),
"year" : "2017",
"make" : "ford",
"color" : "black",
"km" : 34000,
"price" : 2800
}





מצא את המכוניות מתוצרת פורד משנת 2017
mysql> select * from car  where make = "ford" and year = "2017"
Will result:

year make color km price
2017 ford black 34000 28000



> db.car.find( {make: "ford", year: "2017"} ).pretty()
Will result:

{ "_id" : ObjectId("600c63cf32e0e6419cee81af"),
"year" : "2017",
"make" : "ford",
"color" : "black",
"km" :34000,
"price" : 280000
}





תחילה נשלב עם התנאי OR המסומן על ידי  :in$ במערך ואז נגדיר ב-AND את השנה.

שאילתת האיחזור מקבלת את הפעולה "in" כדי שנוכל לציין את התנאים הדומים ל- NoSQL.
mysql> select * from car
where make in ("ford","hyundai") and year = "2017"
Will result:

year make color km price
2017 ford black 34000 28000
2017 hyundai black 34000 28000



> db.car.find( {make: {$in: ["ford","hyundai"] } , year: "2017"} ).pretty()
Will result:

{ "_id" : ObjectId("600c626932e0e6419cee81a7"),
 "year" : "2017",
 "make" : "hyundai",
 "color" : "white",
 "km" : 22000,
 "price" : 32000 }

{ "_id" : ObjectId("600c63cf32e0e6419cee81ab"),
"year" : "2017",
"make" : "ford",
"color" : "black",
"km" : 34000,
"price" : 28000
}





הפונקציה "insertOne" משמשת להכנסת מסמך יחיד לאוסף. עלינו לכתוב את צמדי ערך השדה של המסמך החדש.

הפונקציה "הכנס לתוך" משמשת להוספת שורה חדשה לטבלה. בניגוד ל- NoSQL, איננו צריכים לכתוב את שמות העמודות. עם זאת, סדר הערכים חייב להתאים לסדר העמודות בטבלה
mysql> insert into car values ("2017", "bmw", "silver", 28000, 39000)
Will result:

Query OK, 1 row affected (0.03 sec)
> db.car.insertOne( ... {year: "2017", make: "bmw", color: "silver",km: 28000, price: 39000}
Will result:

{ br>"acknowledged" : true, "insertedId" : ObjectId("600c6bc79445b834692e3b91")
}





נעשה שימוש בפונקציית העדכון. תחילה אנו מעבירים את התנאי המציין את המסמכים לעדכון ואז מעבירים את הערכים המעודכנים יחד עם מילת המפתח שהוגדרה.
עלינו להשתמש בפרמטר multi:true כדי לעדכן את כל המסמכים העומדים בתנאי הנתון. אחרת, רק מסמך אחד מתעדכן.
mysql> update car set make = "BMW" where make = "bmw"
Will result:

Query OK, 5 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0
> db.car.update(
{ make: "ford" },
{ $set: { make: "BMW"} },
{ multi: true }
 )
Will result:

WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })





SQL ו- NoSQL הן מאוד תכליתיות מבחינת צבירת נתונים בעת שאילתות. למשל, אנו יכולים לחשב בקלות את המחיר הממוצע עבור כל מותג.
תחילה אנו מקבצים את המסמכים המבוססים על מותגים על ידי בחירה באפשרות "make$" כמזהה. החלק הבא מציין הן את פונקציית הצבירה שהיא "$ ממוצע" במקרה שלנו והן את השדה שצריך לצרף בעת בחירת העמודה
אם אתה מכיר את Pandas , התחביר דומה למדי לפונקציה groupby.
הקבוצה לפי סעיף משמשת לקיבוץ השורות על בסיס קטגוריות בעמודה הנתונה.
mysql> select make, avg(price) from car group by make
Will result:

make avg(price)
BMW 47400.0000
ford 35333.3333
hyundai 36333.3333
> db.car.aggregate([
{ $group: { _id: "$make", avg_price: { $avg: "$price" }}}
])
Will result:

{ "_id" : "hyundai", "avg_price" : 36333.333333333336 }
{ "_id" : "BMW", "avg_price" : 47400 }
{ "_id" : "ford", "avg_price" : 35333.333333333336 }





אנו יכולים ליישם תנאים בפונקציה מצרפית. בואו נחשב את המחיר הממוצע של מכוניות שיוצרו בשנת 2019.
mysql> select make, avg(price) from car where year = "2019" group by make
Will result:

make avg(price)
BMW 53000.0000
ford 42000.0000
hyundai 41000.0000

> db.car.aggregate([
{ $match: { year: "2019" }},
{ $group: { _id: "$make", avg_price: { $avg: "$price" }}}
])
Will result:

{ "_id" : "BMW", "avg_price" : 53000 }
{ "_id" : "ford", "avg_price" : 42000 }
{ "_id" : "hyundai", "avg_price" : 41000 }




מסקנות


מבנה מסמכים מבוסס NoSQL אינו רק שינוי במבנה מסד נתונים אלא מהפך של ממש בביזור מערכי הנתונים עם טיפול נדרש בעיקביות ומתן זמינות ויכולת עיבדו גבוהים הרבה יותר על מפת האינטרנט הגלובאלית. באמצעות הגדרת מסדי נתונים המאפשרים הפצה של מסדי הנתונים על גבי מספר רב של שרתים כדי לספק זמינות גבוהה למשתמשים רבים בעולם. כמו כן מאפשר מסד נתונים זה, גידול אופקי ואנכי לא מוגבלים במחיר נמוך. יכולות אלו  דוחפות ארגונים רבים להקים את מערכי המידע אירגוניים כמו גם אתרי מסחר, שיתוף מידע וחברה בהתבסס על מסדי נתונים אלו.
במיוחד הנושא נכון אם פועלים בצוותים המנוהלים בשיטות זריזות.

ביזור מערכי מסדי נתונים פעול על תשתית האינטרנט הרחבה וכדי לבצע יישום של הרחבת מסדי הנתונים לפעילות רחבת היקף בעולם הגלובאלי יש צורך להבין לעומק נושאים נוספים וביניהם:  תקשורת, העברת מידע, ערוצי תשתית, הפצה באינטרנט, טכנולוגיות הפצה, תיזמון והיערכות לעקביות בסוף היום. חשוב להבין שתחום ניתוח אפיון ועיצוב מערכות מידע, שונה לחלוטין מזה שהתקיים לפני כעשור. ואיפיון כולל כיום הצגת  חלופות אפשריות, הכוללות: SQL, NoSQL, NewSQL . יש צורך להתאים את אפיון המערכת לנושאי האינטרנט, לריבוי המשתמשים, לעוצמות המחשוב, לביזור השרתים, התקשרות ביניהם ולהתאים אותם למסדי מסמכים (BASE) בשילוב טבלאות (ACID) ולבצע עליהם שאילתות, הוספה, עידכון ומחיקה גלובלאיות.



Join me on LinkedIn
All rights reserved Gideon Koch 1998-2024